package reflect;

import java.lang.reflect.Method;
import java.util.Scanner;

public class ReflectDemo1 {
    public static void main(String[] args) throws ClassNotFoundException {
 /*
         反射的第一步: 获取要操作的类的类对象
         java.lang.Class(类对象)
         它的每一个实例用于表示一个被JVM加载的类
         意味着JVM每加载一个类的同时就会实例化一个Class对象与之绑定
         并在该Class实例上记录所加载的类的一切信息，通过Class可以了解这个类的所有信息
         */

        //获取Class类对象的方式:
        /*
        //1.通过.class获取类对象
        Class cls1 = String.class; //获取String的类对象
        Class cls2 = ArrayList.class; //获取ArrayList的类对象
        Class cls3 = int.class; //获取int基本类型的类对象

        //2.通过指定类的完全限定名获取一个类的类对象
        Class cls4 = Class.forName("java.lang.String");
        Class cls5 = Class.forName("java.util.ArrayList");
        Scanner scan = new Scanner(System.in);
        System.out.println("请输入一个类名:");
        String name = scan.nextLine();
        Class cls6 = Class.forName(name);
         */

        //Class类对象的基本功能:
        //java.lang.String  java.lang.StringBuilder  java.util.ArrayList
        Scanner scan = new Scanner(System.in);
        System.out.println("请输入一个类名:");
        String name = scan.nextLine();
        Class cls = Class.forName(name); //基于类名构造Class对象

        System.out.println("获取类的完全限定名:"+cls.getName());
        System.out.println("获取类名:"+cls.getSimpleName());

        Package pack = cls.getPackage(); //获取包
        System.out.println("获取包名:"+pack.getName());

        Method[] methods = cls.getMethods(); //获取所有方法
        System.out.println("一共"+methods.length+"个方法");
        for(Method method : methods){
            System.out.println(method.getName()); //获取方法名
        }

    }
}
